home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
amok_lha
/
amok58.lha
/
NPrint
/
txt
/
Trenne.mod
< prev
next >
Wrap
Text File
|
1993-08-15
|
8KB
|
361 lines
(**********************************************************************
:Program. Trenne
:Contents. Insert hyphens in a word (german)
:Author. Toolbox 4 89 Matthias Uphoff (Turbo Pascal)
:Author. Ported to M2 by Oliver Schersand
:Address. Schillerstr 4 7805 Bötzingen
:Phone. 07663/3049
:Copyright. Public Domain
:Language. Modula-2
:Translator. M2Amiga AMSoft 3.3d
:History. V1.0 11.02.1990
**********************************************************************)
(* $V- $R- $S- $F- *)
IMPLEMENTATION MODULE Trenne;
IMPORT ASCII;
FROM Arts IMPORT Assert;
FROM SYSTEM IMPORT ADR;
FROM FileSystem IMPORT Lookup,Close,ReadChar,Response,File;
FROM Str IMPORT FirstPos,Length;
FROM Strings IMPORT Insert;
CONST
MaxTS = 40;
TYPE
Str350 = ARRAY[0..350] OF CHAR;
Str300 = ARRAY[0..300] OF CHAR;
Str150 = ARRAY[0..150] OF CHAR;
Str100 = ARRAY[0..100] OF CHAR;
Str50 = ARRAY[0..50 ] OF CHAR;
TSArray = ARRAY[0..MaxTS] OF INTEGER;
VAR
BeginnAusnahmen : Str150;
Vorsilben : Str150;
BeginnSpezial : Str300;
Beginn5 : Str150;
Beginn4 : Str150;
Beginn3 : Str150;
Beginn2 : Str150;
Diphthong : Str150;
VokalTrenn : Str150;
KonsonantBeginn : Str150;
KonsonantEnde : Str350;
SilbenEnde : Str150;
Nachsilben : Str100;
VokalSilben : Str350;
Konsonanten : Str150;
Vokale : Str150;
Buchstaben : Str100;
TabOnDisk : BOOLEAN; (* Ob die Tabellen schon geladen *)
PROCEDURE InListe( Liste : ARRAY OF CHAR;
VAR Zeile : ARRAY OF CHAR;
VAR Laenge : INTEGER;
p : INTEGER) : BOOLEAN;
VAR i,q : INTEGER;
BEGIN
i := 0;
q := p;
Assert(p >= 0 ,ADR("Scheisse"));
WHILE Liste[i] <= Zeile[q] DO
WHILE (Liste[i] = Zeile[q]) & (Liste[i] # " ") DO
INC(i);INC(q);
END; (* WHILE (Liste[i] = Zeile[q]) & (Liste[i] # " ") *)
IF Liste[i] = " " THEN
Laenge := q-p;
RETURN TRUE;
ELSE
REPEAT INC(i) UNTIL Liste[i] = " ";
END;
INC(i); q := p;
END; (* WHILE Liste[i] <= Zeile[q] *)
Laenge := q-p;
RETURN FALSE;
END InListe;
PROCEDURE SilbenTrennung( Zeile : ARRAY OF CHAR;
VAR Anzahl : INTEGER;
VAR TrennStelle : TSArray);
VAR
p,
Laenge,
Startp,Endp,
linksp : INTEGER;
getrennt : BOOLEAN;
PROCEDURE UpperCase(VAR Zeile : ARRAY OF CHAR);
VAR i : INTEGER;
BEGIN
IF Length(Zeile)=0 THEN RETURN END;
FOR i := 0 TO Length(Zeile)-1 DO
CASE Zeile[i] OF
| "ä" : Zeile[i] := "Ä";
| "ö" : Zeile[i] := "Ö";
| "ü" : Zeile[i] := "Ü";
ELSE
Zeile[i] := CAP(Zeile[i])
END;
END;
END UpperCase;
PROCEDURE Registriere(p : INTEGER);
BEGIN
IF (p > Startp+1) & (p < Endp-1) THEN
IF Anzahl < MaxTS THEN
INC(Anzahl);
TrennStelle[Anzahl] := p;
END;
Startp := p;
END;
getrennt := TRUE;
END Registriere;
PROCEDURE SilbenStart(p : INTEGER) : BOOLEAN;
BEGIN
IF (FirstPos(Vokale,0,Zeile[p] ) # -1) OR
(FirstPos(Vokale,0,Zeile[p+1]) # -1) THEN RETURN TRUE
ELSIF InListe(KonsonantBeginn,Zeile,Laenge,p) &
(FirstPos(Vokale,0,Zeile[p+Laenge]) # -1) &
(Zeile[p-1] # "C") THEN RETURN TRUE
ELSE RETURN FALSE END
END SilbenStart;
PROCEDURE Wortbeginn(VAR p : INTEGER);
PROCEDURE VorTest(lng : INTEGER);
BEGIN
IF SilbenStart(p+lng) THEN
INC(p,lng);
Registriere(p)
END;
END VorTest;
BEGIN
IF NOT InListe(BeginnAusnahmen,Zeile,Laenge,p) THEN
IF InListe(Vorsilben,Zeile,Laenge,p) THEN
VorTest(Laenge);
IF InListe(Vorsilben,Zeile,Laenge,p) THEN
VorTest(Laenge)
END;
END;
IF InListe(BeginnSpezial,Zeile,Laenge,p) & (Zeile[p+Laenge] # "E") THEN
VorTest(Laenge)
ELSIF InListe(Beginn5,Zeile,Laenge,p) THEN
VorTest(5)
ELSIF InListe(Beginn4,Zeile,Laenge,p) THEN
VorTest(5)
ELSIF InListe(Beginn3,Zeile,Laenge,p) THEN
VorTest(3)
ELSIF InListe(Beginn2,Zeile,Laenge,p) THEN
VorTest(2)
END;
END;
END Wortbeginn;
PROCEDURE VokalVokal(linksp,rechtsp : INTEGER);
BEGIN
IF (rechtsp-linksp >= 2) THEN
IF InListe(VokalTrenn,Zeile,Laenge,linksp) & (Zeile[linksp-1] # "Q") THEN
Registriere(linksp+1)
ELSIF rechtsp-linksp >= 3 THEN
IF InListe(Diphthong,Zeile,Laenge,linksp) THEN
Registriere(linksp+2)
END
END;
END;
END VokalVokal;
PROCEDURE KonsonantVokal(linksp : INTEGER);
VAR p,rechtsp : INTEGER;
BEGIN
rechtsp := linksp;
WHILE NOT SilbenStart(linksp) DO
INC(linksp)
END; (* WITH NOT SilbenStart(linksp) *)
IF InListe(KonsonantEnde,Zeile,Laenge,rechtsp) THEN
INC(rechtsp,Laenge)
END; (* IF InListe(KonsonantEnde,Zeile,Laenge,rechtsp) *)
IF linksp < rechtsp THEN
p := linksp;
REPEAT
IF (InListe(Nachsilben,Zeile,Laenge,p)) THEN
linksp := p
ELSIF getrennt & (p>3) THEN
IF InListe(SilbenEnde,Zeile,Laenge,p-4) THEN linksp := p
ELSE INC (p) END;
ELSIF (InListe(VokalSilben,Zeile,Laenge,p)) THEN
linksp := p
ELSE
INC(p);
END;
UNTIL (p > rechtsp) OR (p = linksp);
END; (* IF linksp < rechtsp *)
Registriere(linksp);
END KonsonantVokal;
BEGIN
UpperCase(Zeile);
Anzahl := 0;
Endp := 0;
REPEAT
Startp := Endp;
WHILE (FirstPos(Buchstaben,0,Zeile[Startp]) = -1) &
(Startp <= INTEGER(Length(Zeile))) DO
INC(Startp)
END;
Endp := Startp;
WHILE (FirstPos(Buchstaben,0,Zeile[Endp]) # -1) DO INC(Endp) END;
IF Endp - Startp >= 4 THEN
getrennt := FALSE;
p := Startp;
Wortbeginn(p);
WHILE FirstPos(Konsonanten,0,Zeile[p]) # -1 DO INC(p) END;
WHILE FirstPos(Buchstaben,0,Zeile[p]) # -1 DO
linksp := p;
WHILE FirstPos(Vokale,0,Zeile[p]) # -1 DO INC(p) END;
VokalVokal(linksp,p);
linksp := p;
WHILE FirstPos(Konsonanten,0,Zeile[p]) # -1 DO INC(p) END;
IF FirstPos(Vokale,0,Zeile[p]) # -1 THEN KonsonantVokal(linksp) END;
END; (* WHILE FirstPos(Buchstaben,0,Zeile[p]) # -1 *)
END; (* IF Endp - Startp >= 4 *)
UNTIL Startp = Endp;
END SilbenTrennung;
PROCEDURE TabellenLaden(datei : ARRAY OF CHAR);
VAR ch : CHAR;
In : File;
PROCEDURE GetCh;
VAR lst : CHAR;
BEGIN
REPEAT
lst := ch;
ReadChar(In,ch); IF ch < " " THEN ch := " " END;
UNTIL (ch # " ") OR (lst # " ") OR In.eof;
IF (ch = "#") OR In.eof THEN ch := CHAR(255) END;
END GetCh;
PROCEDURE TabLoad(n : Str100;VAR a : ARRAY OF CHAR);
VAR i : INTEGER;
BEGIN
ch := " ";
GetCh;
Assert(ch = ";",ADR("Datei hat falsche Format"));
ch := " ";i := 0;
LOOP
GetCh;
IF ch # n[i] THEN EXIT END;
INC(i);
END;
Assert((ch = " ") AND (n[i] = 0C),ADR("Falsche Reihenfolge"));
i := 0;
REPEAT
GetCh;
a[i] := ch; INC(i);
UNTIL ch = CHAR(255);
a[i] := 0C;
END TabLoad;
BEGIN
Lookup(In,datei,4096,FALSE);
IF In.res = done THEN
TabLoad("BeginnAusnahmen",BeginnAusnahmen);
TabLoad("Vorsilben",Vorsilben);
TabLoad("BeginnSpezial",BeginnSpezial);
TabLoad("Beginn5",Beginn5);
TabLoad("Beginn4",Beginn4);
TabLoad("Beginn3",Beginn3);
TabLoad("Beginn2",Beginn2);
TabLoad("Diphthong",Diphthong);
TabLoad("VokalTrenn",VokalTrenn);
TabLoad("KonsonantBeginn",KonsonantBeginn);
TabLoad("KonsonantEnde",KonsonantEnde);
TabLoad("SilbenEnde",SilbenEnde);
TabLoad("Nachsilben",Nachsilben);
TabLoad("VokalSilben",VokalSilben);
END;
Buchstaben := "ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜß";
Vokale := "AEIOUYÄÖÜ";
Konsonanten := "BCDFGHJKLMNPQRSTVWXZß";
Close(In);
END TabellenLaden;
PROCEDURE Trennstrich(VAR Zeile : ARRAY OF CHAR;
TrennChar : CHAR);
VAR
i,j,k,an : INTEGER;
ta : TSArray;
tren : ARRAY[0..1] OF CHAR;
BEGIN
IF TabOnDisk THEN
TabellenLaden("devs:TrennTab.txt");
TabOnDisk := FALSE;
END;
tren[0] := TrennChar;
tren[1] := 0C;
SilbenTrennung(Zeile,an,ta);
k := 0;
FOR i := 1 TO an DO
j := ta[i]+k;
Insert(Zeile,j,tren);
IF (CAP(Zeile[j-1]) = "C") AND (CAP(Zeile[j]) = "K") THEN Zeile[j-1] := "k" END;
INC(k);
END;
END Trennstrich;
BEGIN
TabOnDisk := TRUE;
END Trenne.